下面几种说法都是对pnp算法要做的事情的描述,大家自己体会一下
1、PnP(Perspective-n-Point)是求解 3D 到 2D 点对运动的方法。它描述了当我们知道n 个 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿。——《视觉SLAM十四讲》(参考)
2、通俗的讲,PnP问题就是在已知世界坐标系下N个空间点的真实坐标以及这些空间点在图像上的投影,如何计算相机所在的位姿。罗嗦一句:已知量是空间点的真实坐标和图像坐标,未知量(求解量)是相机的位姿。
3、PnP是用来求解3D-2D点对运动的方法(参考)
4、PnP问题就是指通过世界中的N个特征点与图像成像中的N个像点,计算出其投影关系,从而获得相机或物体位姿的问题(参考)
1.2 pnp算法的概念总结下面我在来简单总结一下我个人的理解(参考):
使用Perspective-n-Point (PnP)算法需要知道的已知量和需要求解的未知量:
1.2.1 PnP需要知道的已知量1、需要知道n个世界坐标系下参考点的3D坐标系:$\left{c_1, c_2, c_3, ..., c_n\right}$
2、同时知道这个n个3D坐标对应相机图像坐标系上的2D投影点:$\left{u_1, u_2, u_3, ..., u_n\right}$
注意:
世界坐标系下的3D点和相机坐标系下投影的2D点是一一对应的相机图像坐标系,并不是相机坐标系或相机像素坐标系,注意区分下图是四大坐标系:
3、已知相机摄像头的内参(需要自己提前标注好),相机的摄像头内参包括两部分;
相机的内参矩阵相机畸变系数内参矩阵:
$$ \text { camera matrix }=\left[\begin{array}{ccc} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right] $$
焦距$(f_x, f_y)$和光学中心$(c_x, c_y)$
畸变系数:
$k_1、k_2、k_3$:是径向畸变$p_1、p_2$:是切向畸变1.2.2 PnP需要求的未知量求世界坐标系与摄像机坐标系之间的位姿变换 :$\left{R|t\right}$
R:是旋转矩阵,可以理解为绕x、y、z三个坐标轴方向的旋转t:是平移,可以理解为沿x、y、z三个方向上的平移所以从一个坐标系变换到另外一个坐标系的位姿变换的自由度就是6,三个方向上的旋转和三个方向上的平移。(参考)
1.3 PnP算法的用处从上面可以知道PnP就是计算出两个坐标系之间的位姿变换的:$\left{R|t\right}$
因此PnP用途也很多:
相机位姿跟踪物体位姿跟踪AR/VR、机器人操作SLAM中位姿初值求解相机标定,相机和激光雷达联合标定等2 PnP的常见解法PnP的常用解法也有很多:DLT,P3P,EPnP,UPnP
2.1 PnP解法之DLT 参考:https://zhuanlan.zhihu.com/p/586489372.2 PnP解法之P3P 参考:https://www.jianshu.com/p/b3e9fb2ad0dc上面的文章中还介绍了很多其他的解法
2.3 PnP解法之EPnP 参考:https://blog.csdn.net/jessecw79/article/details/82945918PnP问题是研究如何从3D-2D匹配对中求解摄像头位姿,EPnP算法是一种非迭代的PnP算法
3 opencv中solvePn()函数的介绍与使用 3.1 opencv中solvePnP函数的定义1、在opencv中的slovePnP函数的定义:
3.2 solvePnP()中参数含义: 参考:https://blog.csdn.net/cocoaqin/article/details/77485436参考:https://blog.csdn.net/u010554381/article/details/81983992参考:https://blog.csdn.net/cocoaqin/article/details/778485883.2.1 solvePnP()中的参数1、下面是solvePnP()函数参数含义解释(参考):
objectPoints:特征点的世界坐标,坐标值需为float型,不能为double型,可以为mat类型,也可以直接输入vector
imagePoints:特征点在图像中的像素坐标,可以输入mat类型,也可以直接输入vector,注意输入点的顺序要与前面的特征点的世界坐标一一对应
cameraMatrix:相机内参矩阵
distCoeffs:相机的畸变参数【Mat_(5, 1)】
rvec:输出的旋转向量:
tvec:输出的平移向量
useExtrinsicGuess: 用于SOLVEPNP迭代的参数。如果为true(1),函数使用提供的rvec和tvec值分别作为旋转和平移向量的初始近似,并进一步优化它们。默认值为False。
flags:PnP的计算方法
3.2.2 sovlePnP()中flags参数对应的PnP计算方法flags取值对应的是PnP的计算方法,flags的参数选择(参考):
enum {SOLVEPNP_ITERATIVE = 0,SOLVEPNP_EPNP = 1, //!